/*
 * 上海远境文化传媒有限公司 版权所有
 */
package helper;

import ext.jpa.UUIDModel;
import facade.AppContext;
import jodd.bean.BeanCopy;
import org.apache.commons.lang.StringUtils;
import play.db.Model;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Supplier;

/**
 * Java Bean Helper.
 */
public class BeanHelper {

    /**
     * 把对象转化成Map，用于WS提交.
     */
    public static Map<String, Object> toKeyValuePairs(Object instance) {
        Map<String, Object> map = new HashMap<>();
        BeanCopy.fromBean(instance).toMap(map).copy();
        return map;
    }

    /**
     * 安全的设置String值.
     * 如果没有值，在PatchMode就不修改原对象； 否则就修改原对象为null
     */
    public static void safeSetValue(String targetValue, Consumer<String> consumer) {
        if (patchModeCheck(()-> StringUtils.isNotBlank(targetValue))) {
            consumer.accept(targetValue);
        }
    }

    /**
     * 安全的设置String[]值.
     * 如果没有值，在PatchMode就不修改原对象； 否则就修改原对象为null
     */
    public static void safeSetValue(String[] targetValue, Consumer<String[]> consumer) {
        if (patchModeCheck(()-> targetValue != null)) {
            consumer.accept(targetValue);
        }
    }

    /**
     * 安全的设置Integer值.
     * 如果没有值，在PatchMode就不修改原对象； 否则就修改原对象为null
     */
    public static void safeSetValue(Integer targetValue, Consumer<Integer> consumer) {
        if (patchModeCheck(()-> targetValue != null)) {
            consumer.accept(targetValue);
        }
    }
 /**
     * 安全的设置Integer值.
     * 如果没有值，在PatchMode就不修改原对象； 否则就修改原对象为null
     */
    public static void safeSetValue(Long targetValue, Consumer<Long> consumer) {
        if (patchModeCheck(()-> targetValue != null)) {
            consumer.accept(targetValue);
        }
    }

    /**
     * 安全的设置Boolean值.
     * 如果没有值，在PatchMode就不修改原对象； 否则就修改原对象为null
     */
    public static void safeSetValue(Boolean targetValue, Consumer<Boolean> consumer) {
        if (patchModeCheck(()-> targetValue != null)) {
            consumer.accept(targetValue);
        }
    }



    /**
     * 安全的设置BigDecimal值.
     * 如果没有值，在PatchMode就不修改原对象； 否则就修改原对象为null
     */
    public static void safeSetValue(BigDecimal targetValue, Consumer<BigDecimal> consumer) {
        if (patchModeCheck(()-> targetValue != null)) {
            consumer.accept(targetValue);
        }
    }

    /**
     * patchMode检查.
     * @param checkCondition 如果在patchMode, 只有checkConditon为true才返回true；否则永远返回true
     *
     * @return
     */
    public static boolean patchModeCheck(Supplier<Boolean> checkCondition) {
        if (AppContext.patchMode()) {
            return checkCondition.get();
        }
        return true;
    }

    /**
     * 安全的读取ID.
     */
    public static String getModelId(UUIDModel model) {
        return model != null ? model.getId() : null;
    }
    public static Object getModelKey(Model model) {
        return model != null ? model._key() : null;
    }

    /**
     * 安全的比较2个Model.
     */
    public static boolean isEqualTo(UUIDModel model1, UUIDModel model2) {
        if (model1 == null || model2 == null) {
            return Objects.equals(model1, model2);
        }
        return Objects.equals(getModelId(model1), getModelId(model2));
    }
}
